\documentclass[a4paper,10pt]{article}
\usepackage[top=1.5cm, bottom=1.5cm, left=2cm, right=2cm]{geometry}

\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc} % Use 8-bit encoding that has 256 glyphs
\usepackage{microtype} % Slightly tweak font spacing for aesthetics

\usepackage{hyperref} % For hyperlinks in the PDF
\hypersetup{
  bookmarks=true,         % show bookmarks bar?
  unicode=false,          % non-Latin characters in Acrobat’s bookmarks
  pdfnewwindow=true,      % links in new window
  colorlinks=true,       % false: boxed links; true: colored links
  linkcolor=black,        % color of internal links (change box color with linkbordercolor)
  citecolor=magenta,        % color of links to bibliography
  filecolor=magenta,      % color of file links
  urlcolor=[rgb]{0,0,0.5}           % color of external links
}

\usepackage{multicol}
\usepackage{array}
\usepackage{lastpage}

\usepackage{fancyhdr} % Headers and footers
\pagestyle{fancy} % All pages have headers and footers
\fancyhead{} % Blank out the default header
\fancyfoot{} % Blank out the default footer
\fancyfoot[R]{\thepage/\pageref{LastPage}} % Custom footer text
\renewcommand{\headrulewidth}{0pt}

\setlength{\parindent}{0cm}
\usepackage{listings}
\usepackage{ragged2e}
\usepackage{pdfpages}
\usepackage{graphicx}
\graphicspath{ {./img/} }

\usepackage{minted} % coloration syntaxique

\usepackage{listingsutf8}
\lstdefinestyle{ShellStyle}{
  language=bash,
  breaklines=true,
  basicstyle=\footnotesize\ttfamily\color{black},
  % numbers=left,
  % numberstyle=\small,
  % numbersep=3pt,
  frame=tb,
  % columns=fullflexible,
  backgroundcolor=\color{yellow!20},
  linewidth=0.95\linewidth,
  xleftmargin=0.05\linewidth
}

\setcounter{tocdepth}{4}
%----------------------------------------------------------------------------------------
\let\olditemize\itemize
\renewcommand{\itemize}{
    \olditemize
\setlength{\itemsep}{0pt}
    \setlength{\parskip}{0pt}
    \setlength{\parsep}{0pt}
}
\renewcommand{\labelitemi}{$-$}
\renewcommand{\labelitemii}{$\ast$}

\begin{document}

\noindent
\begin{minipage}[t]{.45\textwidth}
    \raggedright
    Université d'Aix-Marseille\\
    Master 2\\
    Enseignant: Mr. Guillaume \textsc{Fuhr}
\end{minipage}
\hfill
\noindent
\begin{minipage}[t]{.45\textwidth}
    \raggedleft
    Vendredi 12 Avril 2013
\end{minipage}
\vspace{1cm}

\centering
\huge{\textsc\textbf{Programmation objet en C++}}\\[1mm]
\noindent\hrulefill\\
\normalsize
\textit{Examen année 2012-2013}\\[3mm]
\justify
Durée: 1h00, Documents non autorisés\\
Calculatrices non autorisées

\noindent\hrulefill

\thispagestyle{fancy} % All pages have headers and footers

\normalsize
\underline{Commentaires :}\\
Les exercices sont indépendants ainsi que les différentes questions.\\
Sauf mention contraire explicite, les programmes à corriger compilent et toutes les dépendances nécessaires sont supposées satisfaites. Autrement dit, ne cherchez pas d'erreurs du style \textit{\texttt{;} manquant en fin de ligne} ou \textit{fichier d'entête manquant}.\\
Le nombre de points de chaque exercice est lié principalement à la durée nécessaire pour la résolution plus qu'à la difficulté associée.

\section*{Exercice 1. Fonctions et instructions (10 points)}
\addcontentsline{toc}{section}{Exercice 1. Fonctions et instructions}

a. Soient les déclarations suivantes :

\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
int fct(int); // fonction I
int fct(double); // fonction II
void fct(int, double); // fonction III
void fct(double, int); // fonction IV

int n, p;
double x, y, z;
char c, d;
\end{minted}

Les appels suivants sont-ils correct et, si oui, quelles seront les fonctions effectivement appelées ?

\begin{center}
    \begin{tabular}{llllll}
        a. \texttt{fct(n)} & b. \texttt{fct(x)} & c. \texttt{fct(n,x)} & d. \texttt{fct(x,n)} & e. \texttt{fct(c)} & f. \texttt{fct(c,d)}\\
        g. \texttt{fct(n,c)} & h. \texttt{fct(n,z)} & i. \texttt{fct(z,z,z)} & & & \\
    \end{tabular}
\end{center}

b. Soit une fonction \texttt{F} qui renvoie 0 si l'argument est strictement positif, et 1 si l'argument vaut 0. Donnez 2 exemples de déclarations de la fonction \texttt{F} permettant l'exécution des instructions suivantes :
\begin{minted}[linenos=false,frame=none,fontsize=\scriptsize]{c++}
double a = F();  // doit renvoyer 1
double b = F(2); // doit renvoyer 0
\end{minted}

c. Soit le programme suivant devant permettre d'ajouter une valeur fournie en argument à une variable fournie également en argument :

\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
#include <iostream>
using namespace std;

void ajoute(int exp, int var)
{
  var += exp;
}

int main(void)
{
  int n = 12;
  int p = 3;
  cout << "Avant, n = " << n << "\n";
  ajoute(2*p+1, ref_n);
  cout << "Apres, n = " << n << "\n";
  return 0;
}
\end{minted}

\begin{enumerate}
    \item Quelles seront les valeurs affichées par le programme ? Pourquoi ?
    \item Corrigez ce programme afin qu'il fonctionne de la manière attendue.
    \item Existe-t-il plusieurs moyens de corriger ce programme ? Si oui lesquels et si non, pourquoi ?
\end{enumerate}

\section*{Exercice 2. Constructeurs et destructeurs (6 points)}
\addcontentsline{toc}{section}{Exercice 2. Constructeurs et destructeurs}

a. Rappelez la définition du constructeur et du destructeur d'une classe.\\

b. Déclaration d'une classe de base.
\begin{enumerate}
    \item Déclarez une classe \texttt{vecteur3d} ayant 3 données membres de types \texttt{double} : \texttt{c$_{x}$}, \texttt{c$_{y}$} et \texttt{c$_{z}$}
    \item On souhaite pouvoir déclarer un vecteur, soit en fournissant explicitement ses trois composantes, soit en n'en fournissant aucune, auquel cas le vecteur créé possèdera trois composantes nulles. Écrire les déclarations du (ou des) constructeur(s) correspondant(s) :
        \begin{itemize}
            \item en utilisant des constructeurs surchargés.
            \item en utilisant un seul contructeur.
        \end{itemize}
    \item Déclarez et définissez le contructeur par copie.
\end{enumerate}

\section*{Exercice 3. Const correctness (4 points)}
\addcontentsline{toc}{section}{Exercice 3. Const correctness}

Pour chaque exemple ci-dessous, donnez le type complet de la variable/fonction dont la déclaration est donnée et indiquez quel est l'apport du mot clé \texttt{const}.

\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
void f(const int &i);
double const g = 5;
double* const h = NULL;
int unecertaineclasse::f2(const int i) const;
\end{minted}

\section*{Exercice 4. Héritage et polymorphisme (6 points)}
\addcontentsline{toc}{section}{Exercice 4. Héritage et polymorphisme}

a. Expliquez la notion d'héritage.\\

b. Quelle est la différence entre les notions d'héritage et de composition ?\\

c. Supposons que nous ayons un programme composé de 3 classes \texttt{classeA}, \texttt{classeB} et \texttt{classeC}. Considérons la fonction \texttt{main} suivante :
\begin{minted}[linenos=true,frame=single,fontsize=\scriptsize]{c++}
  int main(void) {
    
    classeA var1;
    classeB var2(5,8);
    classeC var3;
    classeA var4 = &var1;
    return 0;
  }
\end{minted}

Lors de l'exécution du programme l'affichage suivant se produit :
\begin{lstlisting}[style=ShellStyle]
Constructeur de la classe classeA
Constructeur de la classe classeB
Constructeur de la classe classeA
Constructeur de la classe classeC
Destructeur de la classe classeC
Destructeur de la classe classeA
Destructeur de la classe classeB
Destructeur de la classe classeA
Destructeur de la classe classeA
\end{lstlisting}

En supposant que chaque constructeur/destructeur affiche un message à l'écran indiquant un appel à ce constructeur/destructeur, proposez 2 diagrammes possibles indiquant les relations entre les classes \texttt{classeA}, \texttt{classeB} et \texttt{classeC}.

\end{document}
